/*++

Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved

  SPDX-License-Identifier: BSD-2-Clause-Patent



Module Name:

  IgdOSBCB.ASL

Abstract:

  IGD OpRegion/Software SCI Reference Code for the Baytrail Family.
  This file contains the system BIOS call back functionality for the
  OpRegion/Software SCI mechanism.

--*/


Method (SBCB, 0, Serialized)
{

  // Supported Callbacks: Sub-function 0

  If (LEqual(GESF, 0x0))
  {

    //<TODO> An OEM may support the driver->SBIOS status callbacks, but
    // the supported callbacks value must be modified.  The code that is
    // executed upon reception of the callbacks must be also be updated
    // to perform the desired functionality.

    Store(0x00000000, PARM)         // No callbacks supported

    If(LEqual(PFLV,FMBL))
    {
      Store(0x000F87FD, PARM)         // Mobile
    }
    If(LEqual(PFLV,FDTP))
    {
      Store(0x000F87BD, PARM)         // Desktop
    }

    Store(Zero, GESF)               // Clear the exit parameter
    Return(SUCC)                    // "Success"
  }

  // BIOS POST Completion: Sub-function 1

  If (LEqual(GESF, 1))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Pre-Hires Set Mode: Sub-function 3

  If (LEqual(GESF, 3))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Post-Hires Set Mode: Sub-function 4

  If (LEqual(GESF, 4))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Display Switch: Sub-function 5

  If (LEqual(GESF, 5))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Set TV format: Sub-function 6

  If (LEqual(GESF, 6))
  {

    //<TODO> If implemented, the input values must be saved into
    // non-volatile storage for parsing during the next boot.  The
    // following Sample code is Intel validated implementation.

    Store(And(PARM, 0x0F), ITVF)
    Store(ShiftRight(And(PARM, 0xF0), 4), ITVM)
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)
  }

  // Adapter Power State: Sub-function 7

  If (LEqual(GESF, 7))
  {

    // Upon notification from driver that the Adapter Power State = D0,
    // check if previous lid event failed.  If it did, retry the lid
    // event here.
    If(LEqual(PARM, 0))
    {
      Store(CLID, Local0)
      If(And(0x80000000,Local0))
      {
        And(CLID, 0x0000000F, CLID)
        GLID(CLID)
      }
    }
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Display Power State: Sub-function 8

  If (LEqual(GESF, 8))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Set Boot Display: Sub-function 9

  If (LEqual(GESF, 9))
  {

    //<TODO> An OEM may elect to implement this method.  In that case,
    // the input values must be saved into non-volatile storage for
    // parsing during the next boot.  The following Sample code is Intel
    // validated implementation.

    And(PARM, 0xFF, IBTT)           // Save the boot display to NVS
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Reserved, "Critical failure"
  }

  // Set Panel Details: Sub-function 10 (0Ah)

  If (LEqual(GESF, 10))
  {

    //<TODO> An OEM may elect to implement this method.  In that case,
    // the input values must be saved into non-volatile storage for
    // parsing during the next boot.  The following Sample code is Intel
    // validated implementation.

    // Set the panel-related NVRAM variables based the input from the driver.

    And(PARM, 0xFF, IPSC)

    // Change panel type if a change is requested by the driver (Change if
    // panel type input is non-zero).  Zero=No change requested.

    If(And(ShiftRight(PARM, 8), 0xFF))
    {
      And(ShiftRight(PARM, 8), 0xFF, IPAT)
      Decrement(IPAT)         // 0 = no change, so fit to CMOS map
    }
    And(ShiftRight(PARM, 18), 0x3, IBLC)
    And(ShiftRight(PARM, 20), 0x7, IBIA)
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Success
  }

  // Set Internal Graphics: Sub-function 11 (0Bh)

  If (LEqual(GESF, 11))
  {

    //<TODO> An OEM may elect to implement this method.  In that case,
    // the input values must be saved into non-volatile storage for
    // parsing during the next boot.  The following Sample code is Intel
    // validated implementation.

    And(ShiftRight(PARM, 1), 1, IF1E) // Program the function 1 option

    // Fixed memory/DVMT memory

    And(ShiftRight(PARM, 17), 0xF, IDMS) // Program DVMT/fixed memory size

    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Success
  }

  // Post-Hires to DOS FS: Sub-function 16 (10h)

  If (LEqual(GESF, 16))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // APM Complete:  Sub-function 17 (11h)

  If (LEqual(GESF, 17))
  {

    Store(ShiftLeft(LIDS, 8), PARM) // Report the lid state
    Add(PARM, 0x100, PARM)          // Adjust the lid state, 0 = Unknown

    Store(Zero, GESF)               // Clear the exit parameter
    Return(SUCC)                    // Not supported, but no failure
  }

  // Set Spread Spectrum Clocks: Sub-function 18 (12h)

  If (LEqual(GESF, 18))
  {

    //<TODO> An OEM may elect to implement this method.  In that case,
    // the input values must be saved into non-volatile storage for
    // parsing during the next boot.  The following Sample code is Intel
    // validated implementation.

    If(And(PARM, 1))
    {
      If(LEqual(ShiftRight(PARM, 1), 1))
      {
        Store(1, ISSC)  // Enable HW SSC, only for clock 1
      }
      Else
      {
        Store(Zero, GESF)
        Return(CRIT)    // Failure, as the SSC clock must be 1
      }
    }
    Else
    {
      Store(0, ISSC)          // Disable SSC
    }
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Success
  }

  // Post VBE/PM Callback: Sub-function 19 (13h)

  If (LEqual(GESF, 19))
  {
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Not supported, but no failure
  }

  // Set PAVP Data: Sub-function 20 (14h)

  If (LEqual(GESF, 20))
  {
    And(PARM, 0xF, PAVP)    // Store PAVP info
    Store(Zero, GESF)               // Clear the exit parameter
    Store(Zero, PARM)
    Return(SUCC)                    // Success
  }

  // A call to a reserved "System BIOS callbacks" function was received

  Store(Zero, GESF)                     // Clear the exit parameter
  Return(SUCC)                          // Reserved, "Critical failure"
}
